#2使用蓝图对象来注册路由
import random
import re

from flask import request, abort, current_app, make_response, Response, jsonify

from info import sr
from info.lib.captcha.pic_captcha import captcha
from info.lib.yuntongxun.sms import CCP
from info.modules.test import test_blu

# 图片验证码注册
from info.utils.response_code import RET, error_map


@test_blu.route('/test_img')
def test_img():
    # 获取参数
    test_img_code_id = request.args.get('test_img_code_id')
    # 校验参数,参数不够拒绝访问
    if not test_img_code_id:
        return abort(403)
    # 生成图片验证码
    # 返回三个值
    test_img_name,test_img_text,test_img_bytes = captcha.generate_captcha()
    # 保存图片验证码，通过图片key
    try:
        sr.set('test_img_code_id',test_img_text,ex=60)

    except Exception as e:
    #     错误信息保存到日志中
        current_app.logger.error(e)
        return abort(500)

    # 返回一张图片,自定义图片格式
    # 修改图片响应内容content-type格式
    response = make_response(test_img_bytes) # type:Response
    response.content_type = 'image/jpeg'
    return response


# 短信验证码测试--三个参数，图片key，手机号码，验证码文字
@test_blu.route('/test_sms_code',methods=['POST'])
def test_sms_code():
    # 获取参数
    test_img_code_id = request.json.get('test_img_code_id')
    test_mobile = request.json.get('test_mobile')
    test_img_code = request.json.get('test_img_code')
    # 校验参数
    if not all([test_img_code_id,test_mobile,test_img_code]):
        # 返回参数不足
        return jsonify(error=RET.PARAMERR,errormsg=error_map[RET.PARAMERR])
    # 校验手机号码格式
    if not re.match(r"1[3,5,7,8]\d{9}$",test_mobile):
        # 校验手机号码格式是否正确
        return jsonify(error=RET.PARAMERR,errormsg=error_map[RET.PARAMERR])
    # 检验图片验证码信息是否匹配
    try:
        real_test_img_code = sr.get('test_img_code_id')
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(error=RET.DBERR,errormsg=error_map[RET.DBERR])
    # 判断数据库取出来的数据和参数传过来的数据是否一致
    # 需要大写和确定redis对象需要解码
    if real_test_img_code != test_img_code.upper():
        return jsonify(error=RET.PARAMERR, errormsg=error_map[RET.PARAMERR])

    # 随机生成短信验证码
    rand_num = "(%04d)"%random.randint(0,9999)
    # 打印
    current_app.logger.info('短信验证码%s'%rand_num)
    # 发送短信
    response_code = CCP().send_template_sms(test_mobile, [rand_num, 5], 1)
    if response_code !=0:
        return jsonify(error=RET.THIRDERR, errormsg=error_map[RET.THIRDERR])

    # 保存短信验证码和手机号码
    try:
        sr.set('mobile',rand_num,ex=300)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(error=RET.DBERR, errormsg=error_map[RET.DBERR])

    # 返回结果成功与否即可
    return jsonify(error=RET.OK,errormsg=error_map[RET.OK])
